home *** CD-ROM | disk | FTP | other *** search
/ CD Exchange / CD Exchange - Volume 1.iso / games / pd / chess / src.lha / src / amiga / draw.c < prev    next >
C/C++ Source or Header  |  1992-09-04  |  3KB  |  130 lines

  1. /*
  2.  * Graphics primitives for a chess board.
  3.  * We measure from row 0 to row 7 down, GNUChess the other way round.
  4.  * The macro 'tognurow' converts.
  5.  */
  6. #include <exec/types.h>
  7. #include <intuition/intuition.h>
  8. #include <proto/graphics.h>
  9. #include "display.h"
  10. #include "draw.h"
  11. #include "pieces.h"
  12.  
  13. extern struct RastPort *rp;
  14.  
  15. #define odd(n) (n%2)
  16. #define even(n) (odd(n) ? 0 : 1)
  17. #define tognurow(row) ((row) = 7-(row))
  18.  
  19. /* prototypes for static functions */
  20. static UWORD SquareColor(UWORD row, UWORD col);
  21.  
  22. static UWORD
  23. SquareColor(UWORD row, UWORD col)
  24. {
  25.     if (even(row) ^ odd(col))
  26.         return WHITESQUARE_PEN;
  27.     else
  28.         return BLACKSQUARE_PEN;
  29. }
  30.  
  31. void
  32. AmiDrawCoords(int off, int reverse)
  33. {
  34.     /* NB: font dependent (needs topaz 8) */
  35.     char s[2];
  36.     int i, r, c;
  37.  
  38.     s[0] = ' ';    /* for 'off' */
  39.     s[1] = '\0';
  40.  
  41.     SetAPen(rp, OUTLINE_PEN);
  42.     if (off)
  43.         SetDrMd(rp, JAM2);
  44.  
  45.     for (i = 0; i < 8; i++)
  46.     {
  47.         /* a b c d e f g h */
  48.         c = reverse ? 7-i : i;
  49.         if (!off)
  50.             s[0] = i + 'a';
  51.         Move(rp, SQUARE_LHS(0,c)+1+16, SQUARE_BOTTOM(7,0)+9);
  52.         Text(rp, s, 1);
  53.  
  54.         /* 1 2 3 4 5 6 7 8 */
  55.         r = reverse ? i : 7-i;
  56.         if (!off)
  57.             s[0] = i + '1';
  58.         Move(rp, 1, SQUARE_BOTTOM(r,0)-1-6);
  59.         Text(rp, s, 1);
  60.     }
  61.  
  62.     SetDrMd(rp, JAM1);
  63. }
  64.  
  65. void
  66. AmiDrawGrid()
  67. {
  68.     UWORD i;
  69.  
  70.     Move(rp, LEFT_OFFSET, TOP_OFFSET);
  71.  
  72.     SetAPen(rp, OUTLINE_PEN);
  73.     for (i = 0; i < 9; i++)
  74.     {
  75.          /*=*/    Move(rp, LEFT_OFFSET, TOP_OFFSET+SQUARE_HEIGHT*i);
  76.         Draw(rp, LEFT_OFFSET+SQUARE_WIDTH*8, TOP_OFFSET+SQUARE_HEIGHT*i);
  77.  
  78.          /*||*/    Move(rp, LEFT_OFFSET+SQUARE_WIDTH*i, TOP_OFFSET);
  79.         Draw(rp, LEFT_OFFSET+SQUARE_WIDTH*i, TOP_OFFSET+SQUARE_HEIGHT*8);
  80.     }
  81. }
  82.  
  83. void
  84. AmiToggleSquare(UWORD row, UWORD col)
  85. {
  86.     tognurow(row);
  87.     SetDrMd(rp, COMPLEMENT);
  88.     SetAPen(rp, ~2);
  89.     RectFill(rp,     SQUARE_LHS(row,col), SQUARE_TOP(row,col),
  90.             SQUARE_RHS(row,col), SQUARE_BOTTOM(row,col));
  91.     SetDrMd(rp, JAM1);
  92. }
  93.  
  94. void
  95. AmiFlashSquare(UWORD row, UWORD col)
  96. {
  97.     int i;
  98.     for (i = 0; i < 6; i++)
  99.     {
  100.         AmiToggleSquare(row, col);
  101.         if (i != 5)
  102.             Delay(2);
  103.     }
  104.     SetDrMd(rp, JAM1);
  105. }
  106.  
  107. void
  108. AmiDrawSquare(UWORD row, UWORD col)
  109. {
  110.     tognurow(row);
  111.     SetAPen(rp, SquareColor(row,col));
  112.     RectFill(rp,     SQUARE_LHS(row,col), SQUARE_TOP(row,col),
  113.             SQUARE_RHS(row,col), SQUARE_BOTTOM(row,col));
  114. }
  115.  
  116. void
  117. AmiDrawPiece(UWORD piece, UWORD pccolor, UWORD row, UWORD col)
  118. {
  119.     UWORD sqcolor;
  120.  
  121.     tognurow(row);
  122.     if (SquareColor(row, col) == WHITESQUARE_PEN)
  123.         sqcolor = WHITE;
  124.     else
  125.         sqcolor = BLACK;
  126.  
  127.     DrawImage(rp,     pieceimage[sqcolor][pccolor][piece],
  128.             SQUARE_LHS(row,col), SQUARE_TOP(row,col));
  129. }
  130.